package fisio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import fisio.connection.ConnectionManager;
import fisio.global.Util;
import fisio.model.EntradaLivroCaixa;
import fisio.model.Fisioterapeuta;
import fisio.model.Paciente;

public class EntradaLivroCaixaDAO {

	private static final String SQL_INSERT_ENTRADA = "INSERT INTO entrada_livro_caixa (id_f, id_p, data_reg, descricao, valor) VALUES (?, ?, ?, ?, ?)";
	private static final String SQL_GET_ENTRADA_BY_ID = "SELECT * FROM entrada_livro_caixa WHERE id_e = ?";
	private static final String SQL_GET_ENTRADAS = "SELECT * FROM entrada_livro_caixa ORDER BY data_reg DESC";
	private static final String SQL_GET_ENTRADAS_BY_ID_F = "SELECT * FROM entrada_livro_caixa WHERE id_f = ? LIMIT ?,15";
	private static final String SQL_GET_ENTRADAS_BY_ID_P = "SELECT * FROM entrada_livro_caixa WHERE id_p = ? LIMIT ?,15";
	private static final String SQL_DELETE_ENTRADA = "DELETE FROM entrada_livro_caixa WHERE id_e = ?";
	private static final String SQL_UPDATE_ENTRADA = "UPDATE entrada_livro_caixa SET id_f = ?, id_p = ?, data_reg = ?, descricao = ?, valor = ? WHERE id_e = ?";
	
	public static EntradaLivroCaixa getEntradaLivroCaixa (int id) {

		Connection conn = ConnectionManager.getConnection();
		EntradaLivroCaixa entrada = null;

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_GET_ENTRADA_BY_ID);
			stmt.setInt(1, id);
			
			ResultSet rs = stmt.executeQuery();
			if(rs.next()) {
				entrada = new EntradaLivroCaixa(rs.getInt(1), rs.getInt(2), rs.getInt(3), Util.convertDateSqlToUtil(rs.getDate(4)), rs.getString(5), rs.getDouble(6));
			}

			rs.close();
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na consulta: "+e.getMessage());
		}

		return entrada;
	}
	
	public static void insertEntradaLivroCaixa(EntradaLivroCaixa entrada) {
		
		Connection conn = ConnectionManager.getConnection();

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_INSERT_ENTRADA);
			stmt.setInt(1, entrada.getIdF());
			if(entrada.getIdP() > 0)
				stmt.setInt(2, entrada.getIdP());
			else
				stmt.setNull(2,java.sql.Types.INTEGER);
			stmt.setDate(3, Util.convertDateUtilToSql(entrada.getDataReg()));
			stmt.setString(4, entrada.getDescricao());
			stmt.setDouble(5, entrada.getValor());
			
			stmt.executeUpdate();
			
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na insercao: "+e.getMessage());
		}
	}
	
	public static void updateEntrada(int id, EntradaLivroCaixa entrada) {
		
		Connection conn = ConnectionManager.getConnection();

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_UPDATE_ENTRADA);
			stmt.setInt(1, entrada.getIdF());
			stmt.setInt(2, entrada.getIdP());
			stmt.setDate(3, Util.convertDateUtilToSql(entrada.getDataReg()));
			stmt.setString(4, entrada.getDescricao());
			stmt.setDouble(5, entrada.getValor());
			stmt.setInt(6, id);
			
			stmt.executeUpdate();
			
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na edicao: "+e.getMessage());
		}
	}
	
	public static void deleteEntrada(int id) {
		
		Connection conn = ConnectionManager.getConnection();

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_DELETE_ENTRADA);
			stmt.setInt(1, id);
			
			stmt.executeUpdate();
			
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na remocao: "+e.getMessage());
		}
	}

	public static Vector<EntradaLivroCaixa> getEntradas() {
		
		Connection conn = ConnectionManager.getConnection();
		Vector<EntradaLivroCaixa> todos = new Vector<EntradaLivroCaixa>();

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_GET_ENTRADAS);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				todos.add(new EntradaLivroCaixa(rs.getInt(1), rs.getInt(2), rs.getInt(3), Util.convertDateSqlToUtil(rs.getDate(4)), rs.getString(5), rs.getDouble(6)));
			}

			rs.close();
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na consulta: "+e.getMessage());
		}

		return todos;
	}
	
	public static Vector<EntradaLivroCaixa> getEntradasFisioterapeuta(int pagina, Fisioterapeuta fisioterapeuta) {
		
		Connection conn = ConnectionManager.getConnection();
		Vector<EntradaLivroCaixa> todos = new Vector<EntradaLivroCaixa>();

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_GET_ENTRADAS_BY_ID_F);
			stmt.setInt(1, fisioterapeuta.getId());
			stmt.setInt(2, pagina*15);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				todos.add(new EntradaLivroCaixa(rs.getInt(1), rs.getInt(2), rs.getInt(3), Util.convertDateSqlToUtil(rs.getDate(4)), rs.getString(5), rs.getDouble(6)));	
			}

			rs.close();
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na consulta: "+e.getMessage());
		}

		return todos;
	}
	
	public static Vector<EntradaLivroCaixa> getEntradasPaciente(int pagina, Paciente paciente) {
		
		Connection conn = ConnectionManager.getConnection();
		Vector<EntradaLivroCaixa> todos = new Vector<EntradaLivroCaixa>();

		try {

			PreparedStatement stmt = conn.prepareStatement(SQL_GET_ENTRADAS_BY_ID_P);
			stmt.setInt(1, paciente.getId());
			stmt.setInt(2, pagina*15);
			
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				todos.add(new EntradaLivroCaixa(rs.getInt(1), rs.getInt(2), rs.getInt(3), Util.convertDateSqlToUtil(rs.getDate(4)), rs.getString(5), rs.getDouble(6)));
				
			}

			rs.close();
			stmt.close();
			conn.close();

		} catch(SQLException e) {
			System.out.println("\nERRO na consulta: "+e.getMessage());
		}

		return todos;
	}
}
